// api/queryApi.ts

/**
 * 核心 RAG 查询 API 封装
 * 对应后端 endpoints/queries.py，处理流式查询（SSE）。
 */

import { initializeApiConfig } from './config';
const API_BASE = initializeApiConfig(); 

// --- 类型定义 ---
export interface ChatQueryRequestPayload {
    question: string;
    collection_name: string; // 通常是配置中默认的 collection
    account_id: number;
    session_id?: string;
    chat_history?: any[];     // 聊天历史上下文（完整的消息对象数组）
    target_file_ids?: string[]; // 目标文件 material_id 列表
    filters?: { [key: string]: any }; // 额外的元数据过滤器
    rag_config?: { [key: string]: any }; // 可选的运行时配置覆盖
}

// 辅助函数（流式接口不需要 handleResponse）
// -------------------------------------------------------------------
// --- API 方法定义 ---
// -------------------------------------------------------------------

/**
 * 统一的流式 RAG 查询接口（SSE）
 * POST /api/v1/queries/rag-query-with-context
 * @param payload 包含查询问题、历史等信息的请求体
 * @param onChunkReceived 接收到每个数据块时执行的回调函数
 * @param onError 发生错误时执行的回调函数
 * @returns Promise<void>
 */
export const ragQueryWithContextStream = async (
    payload: ChatQueryRequestPayload,
    onChunkReceived: (chunk: StreamChunkData) => void, 
    onStreamEnd: () => void,
    onError: (error: Error) => void
): Promise<void> => {
    
    try {
        const response = await fetch(`${API_BASE}/queries/rag-query-with-context`, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(payload),
        });

        if (!response.ok || !response.body) {
            const errorData = await response.json().catch(() => ({ detail: '流式请求失败或后端无响应。' }));
            throw new Error(errorData.detail || `HTTP 错误: ${response.status} ${response.statusText}`);
        }

        const reader = response.body.getReader();
        const decoder = new TextDecoder('utf-8');
        let buffer = '';

        while (true) {
            const { done, value } = await reader.read();
            if (done) break;

            buffer += decoder.decode(value, { stream: true });

            // 处理 SSE 流中的多条消息
            const lines = buffer.split('\n');
            buffer = lines.pop() || ''; // 最后一个不完整的行留在 buffer 中

            for (const line of lines) {
                if (line.startsWith('data:')) {
                    const data = line.substring(5).trim();
                    if (data) {
                        try {
                            // 假设后端发送的是 JSON 格式的 StreamChunk（包含 text, sources 等）
                            const chunkData = JSON.parse(data);
                            // 传入整个 chunk 对象，由 Vue 组件决定如何处理
                            onChunkReceived(chunkData); 
                        } catch (e) {
                            // 忽略无法解析的 data 行，或作为原始文本处理
                            // 考虑到后端 StreamingResponse 的设计，这里应始终尝试 JSON 解析
                            console.error("Failed to parse chunk data as JSON, falling back:", data, e);
                            onChunkReceived({ content: data, is_last: false });
                        }
                    }
                } else if (line.startsWith('event:')) {
                    // 可以处理特定的事件，例如 'event: end'
                }
            }
        }
        onStreamEnd();

    } catch (e) {
        // e 可能是 fetch 错误，解析错误，或我们自己抛出的错误
        onError(e instanceof Error ? e : new Error("未知的流式查询错误"));
    }
};

export interface RagSource {
    file_name: string;
    page_number: string;
    material_id: string | null;
}

export interface StreamChunkMetadata {
    rag_sources?: RagSource[];
    sentence_citations?: any[]; // 根据需要定义更详细的类型
    session_title?: string;
}

export interface StreamChunkData {
    content?: string;
    metadata?: StreamChunkMetadata;
    is_last?: boolean;
}